home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / speed.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  8KB  |  363 lines

  1. /* --------------------------------- speed.c -------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* paint the Head Up Display: speed
  8. */
  9.  
  10. #include "plane.h"
  11.  
  12.  
  13. extern void FAR
  14. show_speed (HUD *h, OBJECT *p, int sx, int sy, int maxx, int maxy,
  15.     int orgx, int orgy, int ttx, int tty, int tx, int ty, int ss,
  16.     int shifty, int VVD[2])
  17. {
  18.     int    hud, hud1, big, fine, xfine, fa18, f16, f15, fc, ether, knots;
  19.     int    cas, x, y, base, ybase, s, x0, y0, dd, dm, i, ex, v, speed;
  20.     int    scale_ref, scale_len_l, scale_len_h, g, dx, dy = 0;
  21.     long    t;
  22.     char    *w;
  23.  
  24.     hud = EX->hud;
  25.     hud1 = EX->hud1;
  26.     fine = hud & HUD_FINE;
  27.     xfine = hud & HUD_XFINE;
  28.     big = hud & HUD_BIG;
  29.     i = hud1 & HUD_TYPES;
  30.     fa18 = i == HUD_FA18;
  31.     f16  = i == HUD_F16;
  32.     f15  = i == HUD_F15;
  33.     fc  = i == HUD_CLASSIC;
  34.     ether = i == HUD_ETHER;
  35.     knots = hud1 & HUD_KNOTS;
  36.  
  37.     if (sx < 100) {
  38.         if (xfine)
  39.             fine = 1;
  40.         xfine = 0;
  41.     }
  42.  
  43.     dd = num_size (9L, ss);
  44.  
  45.     speed = p->speed;
  46.     if (EX->hud2 & HUD_CALIBRATED) {
  47.         airdata (p->R[Z], &i, 0, 0, 0);
  48.         speed = fmul (speed, i);
  49.         cas = 'C';
  50.     } else
  51.         cas = 'T';
  52.  
  53.     if (knots) {
  54.         v = speed/2;
  55.         v = (v + fmul (v, 15465))/(VONE/2);    /* knots */
  56.     } else
  57.         v = speed/VONE;                /* meter/sec */
  58.  
  59.     g = (muldiv (EX->Gforce, 100, GACC) + (EX->Gforce>0 ? 5 : -5)) / 10;
  60.         if (EX->maxG < g)
  61.             EX->maxG = g;
  62.  
  63.     gr_color (ST_HFG);
  64.  
  65.     if (fa18 || ether) {
  66.         s = (ss*7+3)/6;                /* the large font */
  67.         dm = num_size (9L, s);
  68.         dm = 4*dm + 1;
  69.         if (h->flags & HF_ETHERFRAME) {
  70.             i = maxx;
  71.             ex = ETHERSPD;
  72.         } else {
  73.             i = sx;
  74.             ex = F18SPD;
  75.         }
  76.         x = i;
  77.         y = dm + fmul (i, ex) + dd;
  78.         if (x > y)
  79.             x = y;
  80.         x = orgx - x;
  81.         x0 = x+dm;                /* right side */
  82.  
  83.         if (!(EX->hud2 & HUD_SPEED))
  84.             goto no_speed18;
  85.  
  86.         gr_move (x,   orgy);    /* outline */
  87.         gr_draw (x,   orgy+s+1);
  88.         gr_draw (x0,  orgy+s+1);
  89.         gr_draw (x0,  orgy);
  90.         gr_draw (x,   orgy);
  91.  
  92.         stroke_char (x-dd, orgy+s, cas, ss, ST_HFG);
  93.  
  94.         t = v;
  95.         dm -= num_size (t, s);
  96.         stroke_num (x+dm, orgy+s, t, s, ST_HFG);
  97. no_speed18:
  98.         if (EX->hud2 & HUD_DIRECTOR) {
  99.             y = orgy + s/2;
  100.             dx = tx * 2;
  101.             if (EX->misc[10] > 10*VONE) {
  102.                 dy = ty * 2;
  103.                 if (EX->misc[10] > 50*VONE)
  104.                     i = ST_HFGI;
  105.                 else
  106.                     i = ST_HFG;
  107.             } else if (EX->misc[10] < -10*VONE) {
  108.                 dy = -ty * 2;
  109.                 if (EX->misc[10] < -50*VONE)
  110.                     i = ST_HFGI;
  111.                 else
  112.                     i = ST_HFG;
  113.             } else
  114.                 i = -1;
  115.  
  116.             if (i >= 0)
  117.                 show_trig (x0+dx+2, y, dx, dy, i);
  118.         }
  119.  
  120.         dm = dd*3/2;
  121.         y0 = fmul(sy, F18LINE);
  122.         if (y0 < s)
  123.             y0 = s;
  124.         y = orgy+fmul(sy, F18LINE0);
  125.         if (EX->hud2 & HUD_BETA) {
  126.             ANGLE    beta;
  127.  
  128.             beta = p->speed ? ASIN (fdiv (EX->v[X], p->speed))
  129.                     : 0;
  130.             stroke_char (x,    y-y0, 'B', ss, ST_HFG);
  131.             stroke_frac (x+dm, y-y0, ANG2DEG00(beta)/10, 0, 1,
  132.                 ss, ST_HFG);
  133.         }
  134.         stroke_char (x, y, 'A', ss, ST_HFG);
  135.         stroke_frac (x+dm, y, ANG2DEG00(EX->aoa)/10, 0, 1, ss,
  136.                 ST_HFG);
  137.  
  138.         y += y0;
  139.         if (!(EX->equip & EQ_GEAR)) {
  140.             stroke_char (x, y, 'M', ss, ST_HFG);
  141.             t = EX->mach/10;
  142.             stroke_frac (x+dm, y, t, 0, 2, ss, ST_HFG);
  143.         }
  144.  
  145.         y += y0;
  146.         stroke_char (x, y, 'G', ss, ST_HFG);
  147.         stroke_frac (x+dm, y, (long)g, 0, 1, ss, ST_HFG);
  148.  
  149.         y += y0;
  150.         stroke_frac (x+dm, y, EX->maxG, 0, 1, ss, ST_HFG);
  151.  
  152.         if (!ether && T(i = EX->weapon)) {
  153.                 y = orgy + fmul (sy, F18WEAPON);
  154.                 w = get_wname (EX->weapon);
  155.                 dm = stroke_size (w, s);
  156.  
  157.                 y += y0;        /* weapon */
  158.                 stroke_str (orgx-dm/2, y, w, s, ST_HFG);
  159.  
  160.                 y += y0;        /* rounds left */
  161.                 stroke_num (orgx-dm/2, y,
  162.                 (long)EX->stores[i-1], s, ST_HFG);
  163.         }
  164.     } else {
  165.         if (f15) {
  166.             scale_ref = 15;
  167.             scale_len_l = 8;
  168.             scale_len_h = scale_len_l;
  169.         } else if (f16) {
  170.             scale_ref = 40;
  171.             scale_len_l = 8;
  172.             scale_len_h = scale_len_l+1;
  173.         } else {
  174.             scale_ref = 30;
  175.             scale_len_l = EX->tapelen;
  176.             scale_len_h = scale_len_l;
  177.         }
  178.  
  179.         if (v >= 0) {
  180.         x0 = (int)(v % 100L);
  181.         ex = (int)(v/100);
  182.         } else {
  183.         x0 = 100-(int)((-v) % 100L);
  184.         ex = -(int)(-v/100 + 1);
  185.         }
  186.         s = x0/10;
  187.         y0 = x0 - s*10;
  188.         ybase = get_center (p, orgy, sy, VVD);
  189.         y0 = ybase + muldiv (y0, sy, scale_ref*10);
  190.  
  191.         base = orgx;
  192.         if (f15)
  193.             base -= fmul (sx, F15SPD);
  194.         else if (f16)
  195.             base -= fmul (sx, F16SPD);
  196.         else
  197.             base -= sx;
  198.  
  199.         dm = f16 ? 2*tx : 2+tx;
  200.  
  201.         if (!(EX->hud2 & HUD_SPEED))
  202.         goto no_speed16;
  203.  
  204. /* draw scale line.
  205. */
  206.         if (f15) {
  207.         y = muldiv (sy, scale_len_h, scale_ref);
  208.         gr_move (base, ybase - y);        /* top */
  209.         y = muldiv (sy, scale_len_l, scale_ref);
  210.         gr_draw (base, ybase + y);        /* bottom */
  211.         }
  212.  
  213.         for (i = 1-scale_len_l, s += i; i <= scale_len_h; ++i, ++s) {
  214.         y = y0 - muldiv (i, sy, scale_ref);
  215.         if (f16||f15) {
  216.             if (f15)
  217.                 y = 2*ybase - y;
  218.             if (0 == s%5) {
  219.                 t = ex*10 + s;
  220.                 if (f15)
  221.                     t *= 10;
  222.                 if (!big)
  223.                     dm = -num_size (t, ss)-2*tx;
  224.                 stroke_num (base+dm, y+ss/2, t, ss, ST_HFG);
  225.                 gr_move (base,       y);
  226.                 gr_draw (base-2*ttx, y);
  227.             } else {
  228.                 gr_move (base,       y);
  229.                 gr_draw (base-1*ttx, y);
  230.             }
  231.         } else if (0 == s%10) {
  232.             gr_move (base, y);
  233.             gr_draw (base -3*ttx, y);
  234.             if (xfine || (i >= -11 && i <= 11)) {
  235.                 t = ex + s/10;
  236.                 if (!big)
  237.                     dm = -num_size (t, ss)-tx;
  238.                 stroke_num (base+dm, y-2, t,
  239.                     ss, ST_HFG);
  240.             }
  241.         } else if (fine) {
  242.             if (0 == s%2) {
  243.                 gr_move (base, y);
  244.                 gr_draw (base-1*ttx, y);
  245.             }
  246.         } else if (0 == s%5) {
  247.             gr_move (base, y);
  248.             gr_draw (base-2*ttx, y);
  249.         } else if (xfine) {
  250.             gr_move (base, y);
  251.             gr_draw (base-1*ttx, y);
  252.         }
  253.         }
  254.  
  255. /* reading mark
  256. */
  257.         if (big)
  258.         base += 3*tx;
  259.         if (f15) {
  260.             gr_move (base+2*tx, ybase-ty);
  261.             gr_draw (base,      ybase);
  262.             gr_draw (base+2*tx, ybase+ty);
  263.             stroke_char (base+2*tx, ybase+ss/2, cas, ss, ST_HFG);
  264.         } else {
  265.             gr_move (base,      ybase);
  266.             gr_draw (base+(f16?4:3)*tx, ybase);
  267.             stroke_char (base+tx, ybase-1, cas, ss, ST_HFG);
  268.         }
  269. no_speed16:
  270.         while (f16) {
  271.         y = ybase - muldiv (sy, scale_len_h, scale_ref) - (ss>>1);
  272.         x = base;
  273.         if (g >= 0 && g < 100)
  274.             x += dd;
  275.         stroke_frac (x, y, (long)g, 0, 1, ss, ST_HFG);
  276.  
  277.         y = ybase + muldiv (sy, scale_len_l, scale_ref) - (ss>>1);
  278.         y0 = orgy+shifty+sy;        /* HUD bottom */
  279.  
  280.         y += ss;
  281.         if (y > y0)
  282.             break;
  283.         stroke_str (base+dd, y, get_wname (EX->weapon), ss, ST_HFG);
  284.  
  285.         y += ss;
  286.         if (y > y0)
  287.             break;
  288.         t = EX->mach/10;
  289.         stroke_frac (base+dd, y, t, 0, 2, ss, ST_HFG);
  290.  
  291.         y += ss;
  292.         if (y > y0)
  293.             break;
  294.         t = EX->maxG;
  295.         x = base-2*dd;
  296.         if (EX->maxG >= 100)
  297.             x -= dd;
  298.         stroke_frac (x, y, t, 0, 1, ss, ST_HFG);
  299.         if (EX->weapon) {
  300.             t = (long)EX->stores[EX->weapon-1];
  301.             x = base + 4*dd - num_size (t, ss);
  302.             if (x < base)
  303.                 x = base;
  304.             stroke_num (x, y, t, ss, ST_HFG);
  305.         }
  306.  
  307.         y += ss;
  308.         if (y > y0)
  309.             break;
  310.         if (WE_M61 == EX->weapon)
  311.             w = EX->target ? "LCOS" : "DGFT";
  312.         else if (WE_MK82 == EX->weapon)
  313.             w = "CCIP";
  314.         else if (EX->weapon)
  315.             w = "XXXX";
  316.         else if (EX->hud2 & HUD_ILS)
  317.             w = "ILS";
  318.         else
  319.             w = "NAV";
  320.         stroke_str (base-2*dd, y, w, ss, ST_HFG);
  321.  
  322.         break;
  323.         }
  324.         while (f15||fc) {
  325.         if (fc)
  326.             base += 3*dd;
  327.         y = ybase + muldiv (sy, scale_len_l, scale_ref) + ss;
  328.         y0 = orgy+shifty+sy;        /* HUD bottom */
  329.  
  330.         y += ss;
  331.         if (y > y0)
  332.             break;
  333.         stroke_str (base-3*dd, y, get_wname (EX->weapon), ss, ST_HFG);
  334.  
  335.         y += ss;
  336.         if (y > y0)
  337.             break;
  338.         t = EX->mach;
  339.         x = base + 2*dd - frac_size (t, -1, 3, ss);
  340.         stroke_frac (x, y, t, -1, 3, ss, ST_HFG);
  341.  
  342.         y += ss;
  343.         if (y > y0)
  344.             break;
  345.         t = g;
  346.         x = base - frac_size (t, 0, 1, ss);
  347.         stroke_frac (x, y, t, 0, 1, ss, ST_HFG);
  348.         stroke_char (base+dd, y, 'G', ss, ST_HFG);
  349.  
  350.         y += ss;
  351.         if (y > y0)
  352.             break;
  353.         if (EX->weapon) {
  354.             t = (long)EX->stores[EX->weapon-1];
  355.             x = base - num_size (t, ss);
  356.             stroke_num (x, y, t, ss, ST_HFG);
  357.         }
  358.  
  359.         break;
  360.         }
  361.     }
  362. }
  363.